#include "fxcc/mono/System.h"

mono::System::System(const std::string& name)
    :m_Name(name)
{
    m_Available = Init();
    if (!m_Available)
    {
        ztclog::info("failed init mono system");
    };
};

bool mono::System::Init()
{
    mono_config_parse(NULL);
    domain = mono_jit_init(m_Name.c_str());

    if (!domain)
    {
        return false;
    }
    return true;
}

bool mono::System::LoadBehivor(const std::string& dllPath)
{
    if (!fs::exists(dllPath) || dllPath.empty())
    {
        return false;
    }
    auto inst = std::make_shared<Behivor>(dllPath);

    if (inst->m_Available)
    {
        m_Behivors[dllPath] = inst;
    }
    return inst->m_Available;
};

std::shared_ptr<mono::Behivor> mono::System::GetBehivor(const std::string& dllPath)
{
    auto it = m_Behivors.find(dllPath);
    if (it != m_Behivors.end())
    {
        return it->second;
    }
    return 0;
}

void mono::System::Cleanup()
{

    mono_jit_cleanup(domain);
}

mono::System::~System()
{
    //Cleanup();
}
